<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

<script>

    // new 关键词只会使代码复杂化。它还会产生某些不可预期的结果：
    var points = new Array(40, 100);  // mark 创建包含两个元素的数组（40 和 100）
    console.log('points ==> ', points);
    points = new Array(40);       // mark 创建包含 40 个未定义元素的数组！！！
    console.log('points.length ==> ', points.length);
    console.log('points ==> ', points);


    /*
    数组没有属于自己的类型,  typeof 运算符返回 "object"，因为 JavaScript 数组属于对象。
    为了解决这个问题，ECMAScript 5 引入了 Array 对象, 并定义了新方法 Array.isArray( your_array )
    * */
    console.log(' typeof  Array ==> ', typeof Array);
    console.log('Array ==> ', Array);
    console.log('Array.isArray ==> ', Array.isArray);
    console.log('points  is array ==> ', Array.isArray(points));
    console.log(" points instanceof Array ==>", points instanceof Array);


    //与其说是数组, 不如说是类似于 Java中的 集合
    var array1 = new Array();
    array1[0] = "凤舞九天";
    array1[1] = false;
    array1[2] = 123;


    //使用字面量来创建数组
    var array2 = [1, 22, 333, 4, 5, 6];


    /*-----------------  遍历      -------------*/
    for (let i = 0; i < array1.length; i++) {
        console.log('array[' + i + ']:', array1[i]);
    }
    //value 元素值, index 元素索引, obj 数组本身
    array2.forEach(function (value, index, arraySelf) {
        console.log(index + " : " + value);
    });


    console.log(array2.forEach(function (value, index, array) {
        value += 1;
        return value;
    }));
    console.log('array2.toString() ==> ', array2.toString());  // foreach中操作不会改变原来的值, 并且没有返回值


    /*-----------------   toString()      -------------*/

    console.log('array1.toString() ==> ', array1.toString());  //用,连接每个元素


    /*-----------------   join( str )   -------------*/
    var year = '2021';
    var month = "10";
    var day = '15';
    var birthday = [year, month, day];
    console.log('array1.join( "-" ) ==> ', birthday.join('-'));


    /*-----------------  push(  obj  )   压栈    -------------*/
    //push 方法添加 元素, 返回数组的长度
    array2.push("c++");

    array2.push({
        name: "sky",
        age: 22
    });
    console.log(' array2.push(22) ==> ', array2.push(22));


    /*-----------------   pop()  弹栈 -------------*/

    //pop 方法删掉数组的最后一个元素, 返回被删掉的元素
    let var1 = array2.pop();
    console.log("var1: " + var1);
    var1 = array2.pop();
    console.log("var1: " + var1);
    var1 = array2.pop();
    console.log("var1: " + var1);

    /*-----------------   shift()   弹队列  -------------*/
    //位移与弹出等同，但处理首个元素而不是最后一个;     shift() 方法会删除首个数组元素，并把所有其他元素“位移”到更低的索引。

    var fruits = ["Banana", "Orange", "Apple", "Mango"];
    console.log(' fruits.shift() ==> ', fruits.shift());             // 从 fruits 删除第一个元素 "Banana"
    console.log('fruits.toString() ==> ', fruits.toString());


    /*-----------------   unshift()   压队列  -------------*/
    fruits = ["Banana", "Orange", "Apple", "Mango"];
    console.log(' fruits.unshift() ==> ', fruits.unshift("Lemon")); // 向 fruits 添加新元素 "Lemon"
    console.log('fruits.toString() ==> ', fruits.toString());


    /*----------------- splice() 捻接（绳子）；拼接，接合（胶片等）；  动态拼装表格, 特别好使     -------------*/
    fruits = ["Banana", "Orange", "Apple", "Mango"];
    /*第一个参数 定义了应添加新元素的位置（拼接）。
    第二个参数  定义应删除多少元素。
    其余参数（“Lemon”，“Kiwi”）定义要添加的新元素。
    mark:  splice() 方法返回一个包含已删除项的数组;
    为什么要搞的那么复杂呢?  第二个参数就是要声明,  后面的元素要不要保留? 我是直接插入进去, 还是替换掉某一部分 ?
    */
    console.log(' fruits.splice(2, 1, "Lemon", "Kiwi") ==> ', fruits.splice(0, 1000, "Lemon", "Kiwi"));
    console.log('fruits.toString() ==> ', fruits.toString());

    var baseCol = [
        {
            field: 'regDate',
            title: '注册日期',
            width: 120
        }, {
            field: 'changeDate',
            title: '更新日期',
            width: 120
        }, {
            field: 'merchantNo',
            title: '商户编号',
            width: 180,
        }, {
            field: 'merchantName',
            title: '商户名称',
            minWidth: 300
        }, {
            field: 'expander',
            title: '客户经理',
            width: 120,

        },
        {
            field: 'belongBranch',
            title: '团队归属',
            width: 150
        }
        ,
        {
            field: 'maintener',
            title: '维护人',
            width: 120
        },

        {
            field: 'merStatus',
            title: '商户状态',
            width: 100,
            templet: '#vspMerStatusTpl'
        }, {
            field: 'division',
            title: '事业部',
            width: 200

        }, {
            field: 'cooperationCode',
            title: '合作方编号',
            width: 200

        }, {
            field: 'channelRemark',
            title: '渠道备注',
            width: 200
        }, {
            field: 'projectName',
            title: '项目名称',
            width: 150
        }, {
            field: 'fatherMerNo',
            title: '父商户号',
            width: 180
        },
        {
            field: 'lastTransDatetime',
            title: '最后一笔交易时间',
            width: 180
        },
        {
            field: 'settleBankName',
            title: '结算开户行',
            width: 180
        },
        {
            title: '操作',
            minWidth: 80,
            align: 'center',
            fixed: 'right',
            toolbar: '#table-content-merchant-toolbar-list'
        }
    ];


    baseCol.splice(6, 0, {
        field: 'dataAuthExpander',
        title: '客户经理(权限)',
        width: 120
    }, {
        field: 'dataAuthDepartment',
        title: '团队归属(权限)',
        width: 150
    });

    console.log('baseCol ==> ', baseCol);

    /*-----------------    slice () 切割  -------------*/

    fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
    console.log('fruits.slice(1, 3).toString ==> ', fruits.slice(1, 3).toString());


    /*-----------------    concat() 数组合并, but  并不能去重      -------------*/

    var arr1 = ["Cecilie", "Lone"];
    var arr2 = ["Emil", "Tobias", "Linus", "Lone"];
    var arr3 = ["Robin", "Morgan"];
    var myChildren = arr1.concat(arr2, arr3);   // 将arr1、arr2 与 arr3 连接在一起
    console.log('myChildren.toString() ==> ', myChildren.toString());


    /*-----------------  sort( function(){})    -------------*/

    points = [40, 100, 1, 5, 25, 10];
    /* 函数比较两个值时，会将值发送到比较函数，并根据所返回的值（负、零或正值）对这些值进行排序。
    * 数组一旦排序, 原来的结构会改变
    * */
    console.log('points.sort  ==> ', points.sort(function (a, b) {
        return b - a
    }));


    /*---------------- ----------- ----------- ------------    λ 表达式  ----------- ----------- ----------- -------------*/

    /*----------------- filter 过滤     -------------*/

    var numbers = [45, 4, 9, 16, 25];
    var over18 = numbers.filter(function (value, index, array) {
        return value > 18;
    });
    console.log('numbers.filter ==> ', over18.toString());

    /*----------------- map 遍历处理     -------------*/
    //想要批量处理  原来的 array  可以用 map 去处理,  可以获取一个 处理过的 新 array ;
    console.log(" array2.map() ==>", array2.map(function (value, index, array) {
        value += 1;
        return value;
    }));

    /*-----------------   reduce()   -------------*/
    //方法在每个数组元素上运行函数，以某种机制生成单个值。 生成一个结晶, 故称减少 reduce


    var sum = numbers.reduce(function (total, value, index, array) {
        return total + value;
    });
    console.log('sum ==> ', sum);


    /*-----------------  every()      -------------*/
    /*
     * every() 方法检查所有数组值是否通过测试。 这个例子检查所有数组值是否大于 18：
     * */
        var isAllOver18 = numbers.every(function (value, index, array) {
        return value > 18;
    });
    console.log('isAllOver18 ==> ', isAllOver18);


</script>
</body>
</html>
